package br.com.rglariguet.pioneer.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.rglariguet.pioneer.filtropesquisa.FiltroReparo;
import br.com.rglariguet.pioneer.modelos.Reparo;

import com.google.common.base.Strings;

@Repository
@Transactional
public class ReparoDAO extends DaoGenerico<Reparo> {

	public List<Reparo> listarTodos(String nomeCriadorReparo) {
		return (List<Reparo>) getSession().createQuery("from Reparo as reparo where nomeCriadorReparo = :nomeCriadorReparo order by reparo.id asc")
				.setParameter("nomeCriadorReparo", nomeCriadorReparo).list();
	}

	public Reparo buscaPorId(long id, String nomeCriadorReparo) {
		return (Reparo) getSession().createQuery("from Reparo as reparo where nomeCriadorReparo = :nomeCriadorReparo and reparo.id = :id").setParameter("id", id).setParameter("nomeCriadorReparo", nomeCriadorReparo).uniqueResult();
	}
	
	public Reparo buscaPorId(long id) {
		return (Reparo) getSession().createQuery("from Reparo as reparo where reparo.id = :id").setParameter("id", id).uniqueResult();
	}

	public List<Reparo> listarComFiltro(FiltroReparo filtro) {

		StringBuilder sql = new StringBuilder();
		Map<String, Object> parametros = new HashMap<String, Object>();

		sql.append("from Reparo as reparo ");
		sql.append("where 0 = 0 and ");
		
		if (!Strings.isNullOrEmpty(filtro.getNomeCriadorReparo())) {
			sql.append("nomeCriadorReparo like :nomeCriadorReparo and ");
			parametros.put("nomeCriadorReparo", filtro.getNomeCriadorReparo());
		}
		if (filtro.getEntradaDeReparoDe() != null) {
			sql.append("reparo.dataDeEntrada >= :entradaDeReparoDe and ");
			parametros.put("entradaDeReparoDe", filtro.getEntradaDeReparoDe());
		}
		if (filtro.getEntradaDeReparoAte() != null) {
			sql.append("reparo.dataDeEntrada <= :entradaDeReparoAte and ");
			parametros.put("entradaDeReparoAte", filtro.getEntradaDeReparoAte());
		}
		if (filtro.getFinalizacaoReparoDe() != null) {
			sql.append("reparo.dataDeFinalizacao >= :finalizacaoReparoDe and ");
			parametros.put("finalizacaoReparoDe", filtro.getFinalizacaoReparoDe());
		}
		if (filtro.getFinalizacaoReparoAte() != null) {
			sql.append("reparo.dataDeFinalizacao <= :finalizacaoReparoAte and ");
			parametros.put("finalizacaoReparoAte", filtro.getFinalizacaoReparoAte());
		}
		if (filtro.getDataModificacaoDe() != null) {
			sql.append("reparo.dataDeModificacao >= :dataModificacaoDe and ");
			parametros.put("dataModificacaoDe", filtro.getDataModificacaoDe());
		}
		if (filtro.getDataModificacaoAte() != null) {
			sql.append("reparo.dataDeModificacao <= :dataModificacaoAte and ");
			parametros.put("dataModificacaoAte", filtro.getDataModificacaoAte());
		}
		if (!Strings.isNullOrEmpty(filtro.getModelo())) {
			sql.append("reparo.produto.dadosBasicos.modelo like :modelo and ");
			parametros.put("modelo", filtro.getModelo());
		}
		if (!Strings.isNullOrEmpty(filtro.getNumeroSerie())) {
			sql.append("reparo.produto.numeroDeSerie like :numeroSerie and ");
			parametros.put("numeroSerie", filtro.getNumeroSerie());
		}
		if (filtro.getStatus() != null) {
			sql.append("reparo.status = :status and ");
			parametros.put("status", filtro.getStatus());
		}
		if (!Strings.isNullOrEmpty(filtro.getNumeroReparo())) {
			sql.append("reparo.numeroInternoDoReparo like :numeroReparo and ");
			parametros.put("numeroReparo", filtro.getNumeroReparo());
		}
		if (!Strings.isNullOrEmpty(filtro.getOrdemServico())) {
			sql.append("reparo.numeroDaOrdemDeServico like :ordemServico and ");
			parametros.put("ordemServico", filtro.getOrdemServico());
		}

		sql.append("0 = 0 ");
		sql.append("order by reparo.id asc");

		Query query = getSession().createQuery(sql.toString());

		for (Map.Entry<String, Object> paramentro : parametros.entrySet()) {
			if (paramentro.getValue().getClass().toString().contains("String")) {
				query.setParameter(paramentro.getKey(), "%" + paramentro.getValue() + "%");
			} else {
				query.setParameter(paramentro.getKey(), paramentro.getValue());
			}
		}

		return (List<Reparo>) query.list();
	}

}
